package org.apli.haiam.admin.jsf.managed;

import com.apli.controladores.Aplinfo;
import com.apli.controladores.AplinfoFactoryBean;
import java.awt.Graphics;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.ResolutionSyntax;
import javax.print.attribute.standard.JobName;
import javax.print.attribute.standard.MediaPrintableArea;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.PrinterResolution;
import org.apli.haiam.admin.entidades.UsuarioAdmin;
import org.apli.haiam.ejb.entidades.AdmDatosGlobales;
import org.apli.haiam.ejb.entidades.AdmDivisionPolitica;
import org.apli.haiam.ejb.entidades.AdmLugarAtencion;
import org.apli.haiam.ejb.entidades.AdmTipoInstitucion;
import org.apli.haiam.ejb.entidades.AdmUsuario;
import org.apli.haiam.ejb.entidades.CexEspecialidad;
import org.apli.haiam.ejb.entidades.CexHistoriaClinica;
import org.apli.haiam.ejb.interfaces.AdministradorHaiam;
import org.apli.haiam.ejb.interfaces.ConsExternaAdministrador;
import org.apli.jsf.managed.JsfBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Clase backing Bean que administra la entidad CexHistoriaClinica.
 * <p>
 * <H6>Soporte:HAIAM
 * <I>david_s_1086@hotmail.com,david.carranza@haiam.gob.ec</I></H6>
 *
 * @author david Carranza
 * @version 1.0 30/07/2014
 */
@ManagedBean
@ViewScoped
public class JsfPaciente extends JsfBean<CexHistoriaClinica> {

    final Logger log = LoggerFactory.getLogger(JsfPaciente.class);
    @EJB
    protected ConsExternaAdministrador adminConsExt;
    private String consultaUsername;
    public int cadulaInc = 0;
    private CexEspecialidad especialidad;
    private AdmDivisionPolitica provincia;
    private AdmDivisionPolitica canton;
    private AdmDivisionPolitica parroquia;
    private Date fechaActual;
    private Date fechaRestada;
    private UsuarioAdmin user;
    private boolean activo;
    private String parBusqueda;
    private String atrBusqueda;
    private Boolean habilitar;
    private String apellidoPbusqueda;
    private String apellidoMbusqueda;
    private String pnombrebusqueda;
    private String snombrePbusqueda;
    private CexHistoriaClinica objImp;
    private boolean habilitarHc;
    private AdmUsuario admUsuario;
    private List<AdmDatosGlobales> listaDatosGlobales;
    private List<AdmDatosGlobales> listaImpresoras01;
    private List<AdmDatosGlobales> listaImpresorasstickers;
    private static final String TIPO_IMPRESORAS = "TLP_2844";
    private static final String TIPO_IMPRESORAS_SAMSUNG = "IMPRESORA_01";
    private static final String NAME_REPORTE = "RPT_HISTORIA_CLINICA.jasper";
    private static final String TIPO_REPORTE_PDF = "application/pdf";
    Calendar c1 = GregorianCalendar.getInstance();

    /**
     * Constructor por defecto.
     */
    public JsfPaciente() {
        // super();
    }

    /**
     * Obtiene el objeto remoto.
     */
    @Override
    protected void cargarEjb() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (adminConsExt == null) {
            String ejbPath = null;
            try {
                ResourceBundle property = getProperties();
                String ORBContext = property.getString("ORBContext");
                String ejbContextPath = property.getString("ejb.context.path.ConsExterna");
                ejbPath = ORBContext + ejbContextPath + "/ConsExternaAdministradorBean";
                adminConsExt = (ConsExternaAdministrador) AplinfoFactoryBean.lookupBean(ejbPath, false);
            } catch (Exception e) {
                log.error("{}: {} - {} ", new Object[]{nombreMetodo, ejbPath, e});
            }
        }
        if (adminObject == null) {
            String ejbPath = null;
            try {
                ResourceBundle property = getProperties();
                String ORBContext = property.getString("ORBContext");
                String ejbContextPath = property.getString("ejb.context.path.admin");
                ejbPath = ORBContext + ejbContextPath + "/AdministradorBeanHaiam";
                adminObject = (AdministradorHaiam) AplinfoFactoryBean.lookupBean(ejbPath, false);
            } catch (Exception e) {
                log.error("{}: {} - {} ", new Object[]{nombreMetodo, ejbPath, e});
            }
        }
    }

    /**
     * Inicializa los datos miembros.
     */
    @Override
    protected void inicializar() {
        object = new CexHistoriaClinica();
        object.setChcEstado(0);
        cadulaInc = 0;
        especialidad = new CexEspecialidad();
        provincia = new AdmDivisionPolitica();
        canton = new AdmDivisionPolitica();
        parroquia = new AdmDivisionPolitica();
        activo = true;
        parBusqueda = "nombre";
        atrBusqueda = new String();
        habilitar = true;
        apellidoPbusqueda = new String();
        apellidoMbusqueda = new String();
        objImp = new CexHistoriaClinica();
        habilitarHc = false;
        try {
            user = (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user");
            admUsuario = user.getUser();
            fechaActual = adminObject.getFechaDb();
            c1 = GregorianCalendar.getInstance();
            c1.setTime(fechaActual);
            c1.add(Calendar.DATE, -7);
            fechaRestada = c1.getTime();
            object.setChcFechaAdmision(fechaActual);
            if (user.getDatosGlobales() == null) {
                listaDatosGlobales = new ArrayList<>();
            } else {
                listaDatosGlobales = user.getDatosGlobales();
            }
            object.setAdmLugarAtencion((AdmLugarAtencion) adminObject.buscar(AdmLugarAtencion.class, 1));
            object.setAdmTipoInstitucion((AdmTipoInstitucion) adminObject.buscar(AdmTipoInstitucion.class, 11));
            cargarImpresora();
            cargarImpresoraStickers();
        } catch (Exception e) {
            log.error("recuperar usuario() {} ", e.getMessage());

        }

    }

    /**
     * Método optener conexión a EJB de Perfiles.
     *
     * @return
     */
    @Override
    protected ResourceBundle getProperties() {
        return ResourceBundle.getBundle("aplicacion");
    }

    /**
     * Graba el registro asociado al objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    @Override
    public String grabarAction() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            //GetMax de la historia clinica

            cadulaInc = 0;
            Integer cedRepetida = 0;
            object.setChcPrimerNombre(object.getChcPrimerNombre().toUpperCase().trim());
            object.setChcSegundoNombre(object.getChcSegundoNombre().toUpperCase().trim());
            object.setChcApellidoPaterno(object.getChcApellidoPaterno().toUpperCase().trim());
            object.setChcApellidoMaterno(object.getChcApellidoMaterno().toUpperCase().trim());
            //object.setChcNombrePadre(object.getChcNombrePadre().toUpperCase().trim());
            //object.setChcNombreMadre(object.getChcNombreMadre().toUpperCase().trim());
            object.setChcNombreFull(object.getChcApellidoPaterno().toUpperCase().concat(" ").concat(object.getChcApellidoMaterno().toUpperCase().concat(" ").concat(object.getChcPrimerNombre().toUpperCase().concat(" ").concat(object.getChcSegundoNombre().toUpperCase()))));
            object.setChcBarrio(object.getChcBarrio().toUpperCase().trim());
            object.setChcLugarNacimiento(object.getChcLugarNacimiento().toUpperCase().trim());
            object.setChcInstruccion(object.getChcInstruccion().toUpperCase().trim());
            object.setChcOcupacion(object.getChcOcupacion().toUpperCase().trim());
            object.setChcNombreEmpresa(object.getChcNombreEmpresa().toUpperCase().trim());
            object.setChcReferido(object.getChcReferido().toUpperCase().trim());
            object.setChcNombreReferencia(object.getChcNombreReferencia().toUpperCase().trim());
            object.setAdmDivisionPolitica(parroquia);
            object.setChcIdInstitucion(user.getUser().getAdmEmpleado().getAdmInstitucion().getIdInstitucion());
            object.setChcNombreInstitucion(user.getUser().getAdmEmpleado().getAdmInstitucion().getNombre());
            object.setChcIdInstitucionSistema(user.getUser().getAdmEmpleado().getAdmInstitucion().getAdmInstitucionSistema().getIdInstitucionSistema());
            object.setChcNombreInstitucionSistema(user.getUser().getAdmEmpleado().getAdmInstitucion().getAdmInstitucionSistema().getNombre());
            object.setChcDireccionReferencia(object.getChcDireccionReferencia().toUpperCase().trim());
            if (habilitar.equals(false)) {
                object.setChcCedula("");
            } else {
                object.setChcPasaporte("");
                validarCedula();
                try {
                    if (object.getChcId() == null) {
                        object.setChcEstado(1);
                        //Codigos que vienen de la isntitucion donde saco la historia clinica
                        //Verifico si la institucion tiene distrito caso copntratio se debe poner division politica
                        object.setChcDipCodigoProvincia(user.getUser().getAdmEmpleado().getAdmInstitucion().getAdmDivisionPolitica().getAdmDivisionPolitica().getAdmDivisionPolitica().getCodigo());
                        object.setChcDipCodigoCanton(user.getUser().getAdmEmpleado().getAdmInstitucion().getAdmDivisionPolitica().getAdmDivisionPolitica().getCodigo());
                        object.setChcDipCodigoParroquia(user.getUser().getAdmEmpleado().getAdmInstitucion().getAdmDivisionPolitica().getCodigo());
                        //object.setChcTipoIngreso(1);
                        object.setChcNombreParroquia(user.getUser().getAdmEmpleado().getAdmInstitucion().getAdmDivisionPolitica().getNombre());
                        object.setChcNombreCanton(user.getUser().getAdmEmpleado().getAdmInstitucion().getAdmDivisionPolitica().getAdmDivisionPolitica().getNombre());
                        object.setChcNombreProvincia(user.getUser().getAdmEmpleado().getAdmInstitucion().getAdmDivisionPolitica().getAdmDivisionPolitica().getAdmDivisionPolitica().getNombre());
                        object.setChcNombreDistrito("17D03| - PUELLARO, CHAVEZPAMBA, ATAHUALPA, S.J MINAS, PERUCHO, EL CONDADO, PONCEANO, SAN ANTONIO, NONO, COTOCOLLAO, POMASQUI, CALACALI, COMITE DEL PUEBLO, CARCELEN");
                        object.setChcIdUsuario(user.getUser().getIdUsuario().intValue());
                        object.setChcNombreUsuario(user.getUser().getAdmEmpleado().getNombreFull());

                        if (admin.existePorCampo(object.getClass(), "chcCedula", object.getChcCedula())) {
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Cédula ya existe", "Cédula ya existe"));
                            cedRepetida = 1;
                        } else {
                            cedRepetida = 0;
                        }
                    }
                } catch (Exception e) {
                    log.error("Verificar si existe cedula repetida() {} ", e.getMessage());
                    //FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
                }
            }

            if (cadulaInc == 1) {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "cedula").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Cédula incorrecta", "Cédula incorrecta"));
            } else {
                if (object.getChcId() == null) {
                    if (cedRepetida == 0) {
                        try {
                            Integer hcMax = new Integer((String) admin.getMax(CexHistoriaClinica.class, "chcHistoriaClinica")) + 1;
                            object.setChcHistoriaClinica(hcMax.toString());
                            object.setChcEstado(1);
                            //object.setChcTipoIngreso(1);
                            //Codigos que vienen de la isntitucion donde saco la historia clinica
                            //Verifico si la institucion tiene distrito caso copntratio se debe poner division politica
                            object.setChcDipCodigoProvincia(user.getUser().getAdmEmpleado().getAdmInstitucion().getAdmDivisionPolitica().getAdmDivisionPolitica().getAdmDivisionPolitica().getCodigo());
                            object.setChcDipCodigoCanton(user.getUser().getAdmEmpleado().getAdmInstitucion().getAdmDivisionPolitica().getAdmDivisionPolitica().getCodigo());
                            object.setChcDipCodigoParroquia(user.getUser().getAdmEmpleado().getAdmInstitucion().getAdmDivisionPolitica().getCodigo());
                            //object.setChcTipoIngreso(1);
                            object.setChcNombreParroquia(user.getUser().getAdmEmpleado().getAdmInstitucion().getAdmDivisionPolitica().getNombre());
                            object.setChcNombreCanton(user.getUser().getAdmEmpleado().getAdmInstitucion().getAdmDivisionPolitica().getAdmDivisionPolitica().getNombre());
                            object.setChcNombreProvincia(user.getUser().getAdmEmpleado().getAdmInstitucion().getAdmDivisionPolitica().getAdmDivisionPolitica().getAdmDivisionPolitica().getNombre());
                            object.setChcNombreDistrito("17D03| - PUELLARO, CHAVEZPAMBA, ATAHUALPA, S.J MINAS, PERUCHO, EL CONDADO, PONCEANO, SAN ANTONIO, NONO, COTOCOLLAO, POMASQUI, CALACALI, COMITE DEL PUEBLO, CARCELEN");
                            object.setChcIdUsuario(user.getUser().getIdUsuario().intValue());
                            object.setChcNombreUsuario(user.getUser().getAdmEmpleado().getNombreFull());
                            object.setChcNombreInstitucionSistema(user.getUser().getAdmEmpleado().getAdmInstitucion().getAdmInstitucionSistema().getNombre());

                            if (!admin.existePorCampo(object.getClass(), "chcHistoriaClinica", object.getChcHistoriaClinica())) {
                                admin.crear(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                                inicializar();
                                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.grabar")));
                            } else {
                                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Historia clínica ya existe", "Historia clínica ya existe"));
                            }

                        } catch (Exception e) {
                            log.error("grabarAction() {} ", e.getMessage());
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
                        }
                    }
                } else {
                    try {
                        if (activo) {
                            object.setChcEstado(1);
                        } else {
                            object.setChcEstado(0);
                        }
                        admin.modificar(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                        //inicializar();
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.actualizar")));
                    } catch (Exception e) {
                        log.error("grabarAction() {} ", e.getMessage());
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
                    }
                }
            }
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
        cargarLista();
        return null;
    }

    /**
     * Carga la lista de objetos en una lista de la página.
     */
    @Override
    public void cargarLista() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (admin == null) {
            lista = null;
            return;
        }
        try {
            lista = admin.listarRangoOrdenada(object.getClass(), "chcFechaAdmision", fechaRestada, fechaActual, "chcId", false);
            //lista = admin.listarOrdenada(object.getClass(), "chcFechaAdmision", fechaActual, "chcId", false);
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Carga en la lista las impresoras para la impresion 01 o cualquier
     * impresora de texto
     */
    public void cargarImpresora() {
        listaImpresoras01 = new ArrayList<>();
        for (AdmDatosGlobales datosGlobales : listaDatosGlobales) {
            if (datosGlobales.getTipo().equals(TIPO_IMPRESORAS_SAMSUNG)) {
                listaImpresoras01.add(datosGlobales);
            }
        }
    }

    /**
     * Carga en la lista las impresoras para la impresion de stickers
     */
    public void cargarImpresoraStickers() {
        listaImpresorasstickers = new ArrayList<>();
        for (AdmDatosGlobales datosGlobales : listaDatosGlobales) {
            if (datosGlobales.getTipo().equals(TIPO_IMPRESORAS)) {
                listaImpresorasstickers.add(datosGlobales);
            }
        }
    }

    /**
     * Calcula la edad actual del paciente ingresado. parametro la fecha de
     * nacimiento
     */
    public void calcularEdad() {
        try {
            Calendar birth = new GregorianCalendar();
            Calendar today = new GregorianCalendar();
            SimpleDateFormat age = new SimpleDateFormat("dd-MM-yyyy");

            int factor = 0;
            object.setChcEdad(0);
            String birthDate1 = age.format(object.getChcFechaNacimiento());
            Date birthDate = new SimpleDateFormat("dd-MM-yyyy").parse(birthDate1);
            Date currentDate = new Date();
            birth.setTime(birthDate);
            today.setTime(currentDate);
            if (today.get(Calendar.MONTH) <= birth.get(Calendar.MONTH)) {
                if (today.get(Calendar.MONTH) == birth.get(Calendar.MONTH)) {
                    if (today.get(Calendar.DATE) > birth.get(Calendar.DATE)) {
                        factor = -1; //Aun no celebra su cumpleaÃ±os
                    }
                } else {
                    factor = -1; //Aun no celebra su cumpleaÃ±os
                }
            }
            object.setChcEdad((today.get(Calendar.YEAR) - birth.get(Calendar.YEAR)) + factor);

        } catch (ParseException e) {
            log.error("calcularEdad {}: {} ", e);

        }

    }

    /**
     * Busqueda de historia clinica por cedula o por historia clinica.
     *
     * @param tipo
     */
    public void busquedaPor(String tipo) {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (admin == null) {
            lista = null;
            return;
        }
        try {
            parBusqueda = tipo;
            if (parBusqueda.equals("nombre")) {
                apellidoPbusqueda = apellidoPbusqueda.toUpperCase().trim();
                apellidoMbusqueda = apellidoMbusqueda.toUpperCase().trim();
                pnombrebusqueda = pnombrebusqueda.toUpperCase().trim();
                snombrePbusqueda = snombrePbusqueda.toUpperCase().trim();
                //lista = admin.ejecutarQueryNativoLista("SELECT * from cex_historia_clinica WHERE hc_apellido_paterno LIKE '%" + apellidoPbusqueda + "%' and hc_apellido_materno like '%" + apellidoMbusqueda + "%' and hc_primer_nombre like '%" + pnombrebusqueda + "%' and hc_segundo_nombre like '%" + snombrePbusqueda + "%'; ", CexHistoriaClinica.class);
                lista = (List<CexHistoriaClinica>) admin.queryEJB("select a from CexHistoriaClinica a where a.chcApellidoPaterno like :var1 and a.chcApellidoMaterno like :var2 and a.chcPrimerNombre like :var3 and a.chcSegundoNombre like :var4 ", "%" + apellidoPbusqueda + "%", "%" + apellidoMbusqueda + "%", "%" + pnombrebusqueda + "%", "%" + snombrePbusqueda + "%");
                if (lista.isEmpty() || lista.size() <= 0) {
                    lista = new ArrayList<>();
                }
            } else {
                lista = admin.listar(object.getClass(), parBusqueda, atrBusqueda);
            }
            //nuevaBusqueda();
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Busqueda de historia clinica por cedula o por historia clinica.
     */
    public void nuevaBusqueda() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (admin == null) {
            lista = null;
            return;
        }
        try {
            atrBusqueda = new String();

        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    @Override
    public String editarAction(CexHistoriaClinica obj) {
        try {
            inicializar();
            object = obj;
            if (object.getChcId() == null) {
                object.setChcFechaAdmision(fechaActual);
            }
            if (object.getAdmDivisionPolitica() != null) {
                parroquia = object.getAdmDivisionPolitica();
                canton = parroquia.getAdmDivisionPolitica();
                provincia = canton.getAdmDivisionPolitica();
            }
            if (object.getChcEstado() == 1) {
                activo = true;
            } else {
                if (object.getChcEstado() == 0 || object.getChcEstado() == 2) {
                    activo = false;
                }
            }

        } catch (Exception e) {
            log.error("editarAction() {} ", e.getMessage());
            //FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
        }
        return null;
    }

    public void validarCedula() {
        FacesContext context = FacesContext.getCurrentInstance();
        if (Aplinfo.isRucCedulaValido(object.getChcCedula()) == false) {
            //FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "cedula").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Cédula incorrecta", "Cédula incorrecta"));
            cadulaInc = 1;
        } else {
            cadulaInc = 0;
        }
    }

    /**
     * Implementa el comportamiento para inicializar los datos del objeto a
     * administrar.
     *
     * @return null, retorna a la página invocada.
     */
    @Override
    public String nuevoAction() {
        inicializar();
        //cargarLista();
        return null;
    }

    /**
     * Duplica la direccion del paciente con la direccion de la referencia
     * personal
     *
     */
    public void duplicarDireccion() {
        try {
            object.setChcDireccionReferencia(object.getChcDireccion());
        } catch (Exception e) {
            log.error("duplicarDireccion() {} ", e.getMessage());
        }

    }

    /**
     * Duplica el telefono del paciente con el telefono de la referencia
     * personal
     *
     */
    public void duplicarTelefono() {
        try {
            object.setChcRelefonoReferencia(object.getChcTelefonoConv());
        } catch (Exception e) {
            log.error("duplicarTelefono() {} ", e.getMessage());
        }

    }

    /*
     * Metodo que imprime directamente en una impresra byte
     */
    public void imprimirSticker(CexHistoriaClinica objetoHistoria) throws IOException {
        InputStream tex1 = null;
        String cadena1;
        String impresora = "SIN IMPRESORA";
        SimpleDateFormat fecha = new SimpleDateFormat("dd/MM/yyyy");
        String fechaNac = null;
        String apellido = null;
        String nombrePaciente = null;
        PrintService impresora11 = null;
        try {
            try {
                fechaNac = fecha.format(objetoHistoria.getChcFechaNacimiento());
                apellido = objetoHistoria.getChcApellidoPaterno().concat(" ").concat(objetoHistoria.getChcApellidoMaterno());
                nombrePaciente = objetoHistoria.getChcPrimerNombre().concat(" ").concat(objetoHistoria.getChcSegundoNombre());
            } catch (Exception e) {
                log.error("imprimirHistoriaClinica(...) " + e);
            }

            cadena1 = "N\n A90,30,0,4,2,1,N,\"" + objetoHistoria.getChcHistoriaClinica() + " \"\n"
                    + "B330,15,0,1,2,4,50,N,\"" + objetoHistoria.getChcHistoriaClinica() + "\"\n"
                    + "A90,90,0,2,2,0,N,\"" + apellido + "\"\n"
                    + "A90,140,0,2,2,0,N,\"" + nombrePaciente + "\"\n"
                    + "P1\n"
                    + "N\n"
                    + "N\n"
                    + "A110,15,0,2,1,1,N,\"HIST.CLINICA\"\n"
                    + "A90,35,0,4,2,1,N,\"" + objetoHistoria.getChcHistoriaClinica() + " \"\n"
                    + "B330,15,0,1,2,4,50,N,\"" + objetoHistoria.getChcHistoriaClinica() + "\"\n"
                    + "A90,90,0,2,2,0,N,\"" + apellido + "\"\n"
                    + "A90,140,0,2,2,0,N,\"" + nombrePaciente + "\"\n"
                    + "P1\n"
                    + "N\n"
                    + "N\n"
                    + "A90,5,0,4,2,1,N,\"" + objetoHistoria.getChcHistoriaClinica() + " \"\n"
                    + "B330,5,0,1,2,4,50,N,\"" + objetoHistoria.getChcHistoriaClinica() + "\"\n"
                    + "A100,50,0,2,1,0,N,\"Apellidos.:\"\n"
                    + "A110,70,0,1,2,0,N,\"" + apellido + "\"\n"
                    + "A100,90,0,2,1,0,N,\"Nombres.:\"\n"
                    + "A110,110,0,1,2,0,N,\"" + nombrePaciente + "\"\n"
                    + "A100,130,0,1,2,0,N,\"P:\"\n"
                    + "A135,130,0,1,2,0,N,\"" + objetoHistoria.getChcNombrePadre() + "\"\n"
                    + "A300,130,0,1,2,0,N,\"M:\"\n"
                    + "A335,130,0,1,2,0,N,\"" + objetoHistoria.getChcNombreMadre() + "\"\n"
                    + "A100,150,0,1,2,0,N,\"F.:\"\n"
                    + "A200,150,0,1,2,0,N,\"" + fechaNac + "\"\n"
                    + "P1\n";

            tex1 = new ByteArrayInputStream(cadena1.getBytes("UTF-8"));

        } catch (UnsupportedEncodingException e) {
            log.error("imprimirSticker() {} ", e.getMessage());
        }
        if (tex1 == null) {
            return;
        }

        DocFlavor docFormat = DocFlavor.INPUT_STREAM.AUTOSENSE;
        Doc document1 = new SimpleDoc(tex1, docFormat, null);

        PrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet();

        for (AdmDatosGlobales datoGlobal : listaImpresorasstickers) {
            if (user.getIp().equals(datoGlobal.getClave())) {
                impresora = datoGlobal.getValor();
                break;
            }
        }
        //PrintService impresora11 = PrintServiceLookup.lookupDefaultPrintService();
        // log.error("ip de la maquina(...) " + user.getIp());
        PrintService[] printService = PrintServiceLookup.lookupPrintServices(null, null);
        for (PrintService printService1 : printService) {
            // log.error("IMPRESORA" + printService1.getName());
            if (printService1.getName().equals(impresora)) {
                impresora11 = printService1;
            }
        }

        if (impresora11 != null) {
            DocPrintJob printJob = impresora11.createPrintJob();

            try {

                printJob.print(document1, attributeSet);

            } catch (PrintException e) {
                log.error("imprimirSticker() {} ", e.getMessage());
            }
        } else {
            log.error("No existen impresoras instaladas");
        }

        tex1.close();

    }

    /**
     * Clse que permite imprimir eol formulario 001 de historias clinicas
     */
    public class ObjetoDeImpresion implements Printable {

        SimpleDateFormat fecha = new SimpleDateFormat("dd/MM/yyyy");
        String fechaNac = null;
        SimpleDateFormat fechaaDM = new SimpleDateFormat("dd/MM/yyyy");
        String fechaAdm = null;
        String mas = "";
        String fem = "";
        String sol = "";
        String cas = "";
        String div = "";
        String viu = "";
        String uli = "";

        @Override
        public int print(Graphics g, PageFormat f, int pageIndex) {
            if (pageIndex == 0) {
                //primerla fila
                if (objImp.getChcNombreInstitucion() != null) {
                    g.drawString(objImp.getChcNombreInstitucion(), 60, 85);
                }
                if (objImp.getChcNombreInstitucionSistema() != null) {
                    g.drawString(objImp.getChcNombreInstitucionSistema(), 340, 85);
                }
                if (objImp.getChcNombreDistrito() != null) {
                    g.drawString(objImp.getChcNombreDistrito(), 490, 85);
                }
                if (objImp.getChcDipCodigoParroquia() != null) {
                    g.drawString(objImp.getChcDipCodigoParroquia(), 555, 85);
                }
                if (objImp.getChcDipCodigoCanton() != null) {
                    g.drawString(objImp.getChcDipCodigoCanton(), 605, 85);
                }
                if (objImp.getChcDipCodigoProvincia() != null) {
                    g.drawString(objImp.getChcDipCodigoProvincia(), 650, 85);
                }
                if (objImp.getChcHistoriaClinica() != null) {
                    g.drawString(objImp.getChcHistoriaClinica(), 730, 85);
                }
                //Segunda linea
                if (objImp.getChcApellidoPaterno() != null) {
                    g.drawString(objImp.getChcApellidoPaterno(), 62, 157);
                }
                if (objImp.getChcApellidoMaterno() != null) {
                    g.drawString(objImp.getChcApellidoMaterno(), 220, 157);
                }
                if (objImp.getChcPrimerNombre() != null) {
                    g.drawString(objImp.getChcPrimerNombre(), 375, 157);
                }
                if (objImp.getChcSegundoNombre() != null) {
                    g.drawString(objImp.getChcSegundoNombre(), 530, 157);
                }
                if (objImp.getChcCedula() != null) {
                    g.drawString(objImp.getChcCedula(), 700, 157);
                }
                //tercer linea
                if (objImp.getChcDireccion() != null) {
                    g.drawString(objImp.getChcDireccion(), 62, 197);
                }
                if (objImp.getChcBarrio() != null) {
                    g.drawString(objImp.getChcBarrio(), 360, 197);
                }
                if (objImp.getChcNombreParroquia() != null) {
                    g.drawString(objImp.getChcNombreParroquia(), 433, 197);
                }
                if (objImp.getChcNombreCanton() != null) {
                    g.drawString(objImp.getChcNombreCanton(), 505, 197);
                }
                if (objImp.getChcNombreProvincia() != null) {
                    g.drawString(objImp.getChcNombreProvincia(), 578, 197);
                }
                if (objImp.getChcTelefonoConv() != null) {
                    g.drawString(objImp.getChcTelefonoConv(), 720, 197);
                }
                //cuarta linea
                if (objImp.getChcFechaNacimiento() != null) {
                    fechaNac = fecha.format(objImp.getChcFechaNacimiento());
                    g.drawString(fechaNac, 62, 255);
                }
                if (objImp.getChcLugarNacimiento() != null) {
                    g.drawString(objImp.getChcLugarNacimiento(), 180, 255);

                }
                if (objImp.getCexNacionalidad() != null) {
                    g.drawString(objImp.getCexNacionalidad().getCnaNombre(), 305, 255);

                }
                if (objImp.getCexGrupoCultural() != null) {
                    g.drawString(objImp.getCexGrupoCultural().getDcuNombre(), 400, 255);

                }
                if (objImp.getChcEdad() != null) {
                    g.drawString(objImp.getChcEdad().toString(), 525, 255);

                }
                if (objImp.getChcInstruccion() != null) {
                    g.drawString(objImp.getChcInstruccion(), 750, 255);
                }
                if (objImp.getChcGenero() == 1) {
                    mas = "X";
                } else {
                    fem = "X";
                }
                if (objImp.getChcEstadoCivil() == 1) {
                    sol = "X";
                } else {
                    if (objImp.getChcEstadoCivil() == 2) {
                        cas = "X";
                    } else {
                        if (objImp.getChcEstadoCivil() == 3) {
                            div = "X";
                        } else {
                            if (objImp.getChcEstadoCivil() == 4) {
                                viu = "X";
                            } else {
                                if (objImp.getChcEstadoCivil() == 5) {
                                    uli = "X";
                                }
                            }
                        }
                    }
                }
                g.drawString(mas, 570, 255);
                g.drawString(fem, 595, 255);
                g.drawString(sol, 620, 255);
                g.drawString(cas, 645, 255);
                g.drawString(div, 670, 255);
                g.drawString(viu, 690, 255);
                g.drawString(uli, 715, 255);

                //QUINTA LINEA
                if (objImp.getChcFechaAdmision() != null) {
                    fechaAdm = fechaaDM.format(objImp.getChcFechaAdmision());
                    g.drawString(fechaAdm, 62, 295);
                }
                if (objImp.getChcOcupacion() != null) {
                    g.drawString(objImp.getChcOcupacion(), 170, 295);
                }
                if (objImp.getChcNombreEmpresa() != null) {
                    g.drawString(objImp.getChcNombreEmpresa(), 305, 295);
                }
                if (objImp.getCexTipoSeguro() != null) {
                    g.drawString(objImp.getCexTipoSeguro().getCtsNombre(), 500, 295);
                }
                if (objImp.getChcReferido() != null) {
                    g.drawString(objImp.getChcReferido(), 720, 295);
                }

                //SEXTA LINEA
                if (objImp.getChcNombreReferencia() != null) {
                    g.drawString(objImp.getChcNombreReferencia(), 62, 338);
                }

                if (objImp.getCexParentesco() != null) {
                    g.drawString(objImp.getCexParentesco().getCpaNombre(), 315, 335);
                }
                if (objImp.getChcDireccionReferencia() != null) {
                    g.drawString(objImp.getChcDireccionReferencia(), 425, 335);
                }
                if (objImp.getChcRelefonoReferencia() != null) {
                    g.drawString(objImp.getChcRelefonoReferencia(), 720, 335);
                }

                //septima linea
                if (user.getUser().getIdUsuario() != null) {
                    g.drawString(user.getUser().getIdUsuario().toString(), 790, 375);
                }

                return PAGE_EXISTS;
            } else {
                return NO_SUCH_PAGE;
            }
        }
    }

    /*
     * Metodo que imprime directamente en una impresra byte
     */
    public void imprimirForm01(CexHistoriaClinica item) throws IOException {
        objImp = item;
        String impresora = "SIN IMPRESORA";
        PrintService impresora11 = null;
        PrintService[] printService = PrintServiceLookup.lookupPrintServices(null, null);
        //PrintService service = PrintServiceLookup.lookupDefaultPrintService();
        //formato a la pagina
        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
        aset.add(new PrinterResolution(580, 450, ResolutionSyntax.DPI));
        aset.add(MediaSizeName.ISO_A3);
        aset.add(new MediaPrintableArea(0, 0, 350, 200, MediaPrintableArea.MM));
        aset.add(new JobName("Impresion formulario 001", Locale.FRENCH));

        for (AdmDatosGlobales datoGlobal : listaImpresoras01) {

            if (user.getIp().equals(datoGlobal.getClave())) {
                // log.error("{}: {} ", "Ip de la maquina ", user.getIp());

                impresora = datoGlobal.getValor();
                break;
            }
        }

        for (PrintService printService1 : printService) {
            log.error("{}: {} ", "Impresora ", printService1.getName());
            if (printService1.getName().equals(impresora)) {
                log.error("{}: {} ", "Seleccionada ", printService1.getName());
                impresora11 = printService1;
            }
        }
        //aset.add(MyMediaSizeName.myMediaSize);
//Indicamos que lo que vamos a imprimir es un objeto imprimible
        DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
        if (impresora11 != null) {
            DocPrintJob pj = impresora11.createPrintJob();

//Creamos el documento a imprimir que contendrá el objeto
            Doc doc = new SimpleDoc(new ObjetoDeImpresion(), flavor, null);

            try {
                pj.print(doc, aset);
            } catch (PrintException e) {
                System.out.println("Error al imprimir: " + e.getMessage());
            }
        } else {
            log.error("No existen impresoras instaladas");
        }

    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    @Override
    public List<SelectItem> getSelectedItem() {
//        try {
//            List<CexHistoriaClinica> datos = admin.listarOrdenada(object.getClass(), "nombre", true);
//            List<SelectItem> items = new ArrayList<SelectItem>();
//            for (CexHistoriaClinica obj : datos) {
//                items.add(new SelectItem(obj, obj.getNombre()));
//            }
//            return items;
//        } catch (Exception e) {
//            log.error("getSelectedItem() {} ", e.getMessage());
//        }
        return null;
    }

    public List<SelectItem> getSelectedItemProvincia() {
        try {
            List<AdmDivisionPolitica> datos = admin.listarNullOrdenada(AdmDivisionPolitica.class, "admDivisionPolitica", "nombre", true);
            List<SelectItem> items = new ArrayList<>();
            for (AdmDivisionPolitica obj : datos) {
                items.add(new SelectItem(obj, obj.getNombre()));
            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItemProvincia() {} ", e.getMessage());
        }
        return null;
    }

    public List<SelectItem> getSelectedItemCanton() {
        try {

            List<SelectItem> items = new ArrayList<>();
            for (AdmDivisionPolitica obj : provincia.getAdmDivisionPoliticaList()) {
                items.add(new SelectItem(obj, obj.getNombre()));
            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItemCanton() {} ", e.getMessage());
        }
        return null;
    }

    public List<SelectItem> getSelectedItemParroquia() {
        try {
            List<SelectItem> items = new ArrayList<>();
            for (AdmDivisionPolitica obj : canton.getAdmDivisionPoliticaList()) {
                items.add(new SelectItem(obj, obj.getNombre()));
            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItemParroquia() {} ", e.getMessage());
        }
        return null;
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    public List<SelectItem> getSelectedItemSubespecialidad() {
//        try {
//            List<CexEspecialidad> datos = admin.listarOrdenada(CexEspecialidad.class, "hcEspecialidad", especialidad, "nombre", true);
//            List<SelectItem> items = new ArrayList<SelectItem>();
//            for (CexEspecialidad obj : datos) {
//                items.add(new SelectItem(obj, obj.getNombre()));
//            }
//            return items;
//        } catch (Exception e) {
//            log.error("getSelectedItem() {} ", e.getMessage());
//        }
        return null;
    }

//    public void imprimirReporte() {
//        String rpt = null;
//        try {
//            rpt = reporte.generarReporteStandar(null, NAME_REPORTE, TIPO_REPORTE_PDF, "Reporte_turnos");
//        } catch (Exception e) {
//            log.error("hostoriaAutocompleteAction(...) " + e);
//        }
//
//    }
    public void imprimirHistoriaClinica() {
        if (object == null) {
            return;
        }
        String rpt = null;
        try {
            adminConsExt.generarReporteStandarExplorador(object, NAME_REPORTE, TIPO_REPORTE_PDF, "", "");
        } catch (Exception e) {
            log.error("imprimirHistoriaClinica(...) " + e);
        }

    }

    public void imprimirHistoriaClinica(CexHistoriaClinica item) {
        if (object == null) {
            return;
        }
        String rpt = null;
        try {
            adminConsExt.generarReporteStandarExplorador(item, NAME_REPORTE, TIPO_REPORTE_PDF, "", "");
        } catch (Exception e) {
            log.error("imprimirHistoriaClinica(...) " + e);
        }

    }

    public void imprimirReporteTurnos() {
        String rpt = null;

        try {
//////////            CexTurnosEnc onj = (CexTurnosEnc) adminObject.buscar(CexTurnosEnc.class, "tueId", 1);
//////            JRBeanCollectionDataSource aux = new JRBeanCollectionDataSource(onj.getCexTurnosDetList());
//////            onj.setCexTurnosDetListJasper(aux);
//////            rpt = reporte.generarReporteStandar(onj, NAME_REPORTE_LISTA, TIPO_REPORTE_PDF, "Reporte_turnos");
        } catch (Exception e) {
            log.error("hostoriaAutocompleteAction(...) " + e);
        }

    }

    public CexEspecialidad getEspecialidad() {
        return especialidad;
    }

    public void setEspecialidad(CexEspecialidad especialidad) {
        this.especialidad = especialidad;
    }

    public String getConsultaUsername() {
        return consultaUsername;
    }

    public void setConsultaUsername(String consultaUsername) {
        this.consultaUsername = consultaUsername;
    }

    public AdmDivisionPolitica getProvincia() {
        return provincia;
    }

    public void setProvincia(AdmDivisionPolitica provincia) {
        this.provincia = provincia;
    }

    public AdmDivisionPolitica getCanton() {
        return canton;
    }

    public void setCanton(AdmDivisionPolitica canton) {
        this.canton = canton;
    }

    public AdmDivisionPolitica getParroquia() {
        return parroquia;
    }

    public void setParroquia(AdmDivisionPolitica parroquia) {
        this.parroquia = parroquia;
    }

    public boolean isActivo() {
        return activo;
    }

    public void setActivo(boolean activo) {
        this.activo = activo;
    }

    public Date getFechaActual() {
        return fechaActual;
    }

    public void setFechaActual(Date fechaActual) {
        this.fechaActual = fechaActual;
    }

    public String getParBusqueda() {
        return parBusqueda;
    }

    public void setParBusqueda(String parBusqueda) {
        this.parBusqueda = parBusqueda;
    }

    public String getAtrBusqueda() {
        return atrBusqueda;
    }

    public void setAtrBusqueda(String atrBusqueda) {
        this.atrBusqueda = atrBusqueda;
    }

    public Boolean getHabilitar() {
        return habilitar;
    }

    public void setHabilitar(Boolean habilitar) {
        this.habilitar = habilitar;
    }

    public String getApellidoPbusqueda() {
        return apellidoPbusqueda;
    }

    public void setApellidoPbusqueda(String apellidoPbusqueda) {
        this.apellidoPbusqueda = apellidoPbusqueda;
    }

    public String getApellidoMbusqueda() {
        return apellidoMbusqueda;
    }

    public void setApellidoMbusqueda(String apellidoMbusqueda) {
        this.apellidoMbusqueda = apellidoMbusqueda;
    }

    public String getPnombrebusqueda() {
        return pnombrebusqueda;
    }

    public void setPnombrebusqueda(String pnombrebusqueda) {
        this.pnombrebusqueda = pnombrebusqueda;
    }

    public String getSnombrePbusqueda() {
        return snombrePbusqueda;
    }

    public void setSnombrePbusqueda(String snombrePbusqueda) {
        this.snombrePbusqueda = snombrePbusqueda;
    }

    public boolean isHabilitarHc() {
        return habilitarHc;
    }

    public void setHabilitarHc(boolean habilitarHc) {
        this.habilitarHc = habilitarHc;
    }

    public AdmUsuario getAdmUsuario() {
        return admUsuario;
    }

    public void setAdmUsuario(AdmUsuario admUsuario) {
        this.admUsuario = admUsuario;
    }
    

}
